UCLUST con id = 97, 98 y 99%

Estas graficas representan las secuencias del Gen E del virus del Dengue analizadas con UCLUST con id= 97, 98 y 99%.

De un total de 5591 datos con genoma completo:

Secuencias similares al 97%

Tabla 1. Datos de secuencias del Gen E 97% disimilares.

Secuencias disimilares al 98%

Tabla 2. Datos de secuencias del Gen E 98% disimilares.

Tabla 3. Datos de secuencias del GEn E 99% disimilares.

Serotipos

Figura 1. Numero de datos por serotipos para las secuencias Disimilares al 97, 98 y 99%

Paises

Figura 2. Paises para secuencias de Gen E 97% disimilares.

India China Tailandia Indonesia Singapur VietNam Filipinas PuertoRico Pakistan Malasia Myanmar Brazil Australia Venezuela EstadosUnidos Timor Somalia Peru Paraguay Mexico PolinesaFrancesa Cambodia Yemen TrinidadYTobago Taiwan SriLanka SurCorea ArabiaSaudita Samoa SanVicenteYGranadas Rusia Nigeria Nicaragua NuevaCaledonia Japon Guam Francia Ecuador Cotedvoire Barbados Bangladesh Argentina

Figura 3. Paises para secuencias de Gen E 98% disimilares.

India China Tailandia Indonesia Singapur VietNam Filipinas PuertoRico Pakistan Malasia Myanmar Brazil Australia Venezuela EstadosUnidos Timor Somalia Peru Paraguay Mexico PolinesaFrancesa Cambodia Yemen TrinidadYTobago Taiwan SriLanka SurCorea ArabiaSaudita Samoa SanVicenteYGranadas Rusia Nigeria Nicaragua NuevaCaledonia Japon Guam Francia Ecuador Cotedvoire Barbados Bangladesh Argentina Peru Honduras Colombia PapuaNuevaGuinea ElSalvador IslaVirgen SurEsteAsia SantaLucia Martinique Laos Haiti Granada Ghana Fiji Angola

Figura 4. Paises para secuencias de Gen E 99% disimilares.

Mapa-Mundi: Numero de casos reportados por paises

Figura 5. Numero de casos reportados por paises.

Mapa-mundi: Serotipos por paises

Figura 6. Distribucion de los serotipos por paises para secuencias 97% disimilares.

Figura 7. Distribucion de los serotipos por paises para secuencias 98% disimilares.

Figura 8. Distribucion de los serotipos por paises para secuencias 99% disimilares.

Localidades: Disimilaridad 97%

Figura 9. Nube de localidades para secuecias del Gen E 97% Disimilares.

Localidades: Disimilaridad 98%

Figura 10. Nube de localidades para secuecias del Gen E 98% Disimilares.

Localidades: Disimilaridad 99%

Figura 11. Nube de localidades para secuecias del Gen E 99% Disimilares.

Mapa-mundi localidades 97% Disimilaridad

Figura 12. Localidades de secuencias del Gen E 97% disimilares.

Mapa-mundi localidades 98% Disimilaridad

Figura 13. Localidades de secuencias del Gen E 98% disimilares.

Mapa-mundi localidades 99% Disimilaridad

Figura 14. Localidades de secuencias del Gen E 99% disimilares.

Años: Disimilaridad 97%

Figura 15. Años registrados para casos con secuencias 97% disimilares.

1945 1960 1962 1963 1968 1970 1972 1973 1974 1978 1979 1980 1982 1983 1986 1988 1991 1993 1994 1995 1996 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 20012 2013 2014

Años: Disimilaridad 98%

Figura 16. Años registrados para casos con secuencias 98% disimilares.

1945 1960 1961 1962 1963 1965 1966 1968 1970 1972 1973 1974 1977 1978 1979 1980 1981 1982 1983 1985 1986 1987 1988 1989 1991 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014

Años: Disimilaridad 99%

Figura 17. Años registrados para casos con secuencias 99% disimilares.

Frecuencia de los años reportados por cada pais: Disimilaridad 97%

Figura 18. Frecuencia de los años reportados para cada pais para secuencias 97% disimilaridad.

Frecuencia de los años reportados por cada pais: Disimilaridad 98%

Figura 19. Frecuencia de los años reportados para cada pais para secuencias 98% disimilaridad.

Frecuencia de los años reportados por cada pais: Disimilaridad 99%

Figura 20. Frecuencia de los años reportados para cada pais para secuencias 99% disimilaridad.

Pais, localidad y año

Figura 21. Frecuencia de los datos con disimilaridad del 97, 98 y 99% que contienen: 1. Pais, 2. Pais y Localidad, 3. Pais, Localidad y año, 4. Pais y año.

LS0tCnRpdGxlOiAiUmVzdWx0YWRvcyBVQ0xVU1QgcGFyYSBzZWN1ZW5jaWFzIGRlbCBHZW4gRSBjb24gaWQ9IDk3LCA5OCB5IDk5JSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMgVUNMVVNUIGNvbiBpZCA9IDk3LCA5OCB5IDk5JSAjIyMKCkVzdGFzIGdyYWZpY2FzIHJlcHJlc2VudGFuIGxhcyBzZWN1ZW5jaWFzIGRlbCBHZW4gRSBkZWwgdmlydXMgZGVsIERlbmd1ZSBhbmFsaXphZGFzIGNvbiBVQ0xVU1QgY29uIGlkPSA5NywgOTggeSA5OSUuCgpEZSB1biB0b3RhbCBkZSA1NTkxIGRhdG9zIGNvbiBnZW5vbWEgY29tcGxldG86CgoqIGlkIDk3JSA6IDE0MiBTZWN1ZW5jaWFzIGRpc2ltaWxhcmVzCiogaWQgOTglIDogMzA1IFNlY3VlbmNpYXMgZGlzaW1pbGFyZXMKKiBpZCA5OSUgOiAxMzEwIFNlY3VlbmNpYXMgZGlzaWxhcmVzCgoKIyMjIFNlY3VlbmNpYXMgc2ltaWxhcmVzIGFsIDk3JSAjIyMKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNixlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgppZHNfOTggPC0gcmVhZC5jc3YoZmlsZSA9ICIvaG9tZS9hbmRyZWEvTFNCL1BpbG90b19EZW5ndWUvZGF0YS9TZWN1ZW5jaWFzX2Rlc2NhcmdhZGFzL1NlY3VlbmNpYXNfZ2VuRS9HZW5FXzk4X0Rpc2ltaWxhcmlkYWRfaWQuY3N2IiwgaGVhZGVyID0gRikKCmlkc185NyA8LSByZWFkLmNzdihmaWxlID0gIi9ob21lL2FuZHJlYS9MU0IvUGlsb3RvX0Rlbmd1ZS9kYXRhL1NlY3VlbmNpYXNfZGVzY2FyZ2FkYXMvU2VjdWVuY2lhc19nZW5FL0dlbkVfOTdfRGlzaW1pbGFyaWRhZF9pZC5jc3YiLCBoZWFkZXIgPSBGKQoKaWRzXzk5IDwtIHJlYWQuY3N2KGZpbGUgPSAiL2hvbWUvYW5kcmVhL0xTQi9QaWxvdG9fRGVuZ3VlL2RhdGEvU2VjdWVuY2lhc19kZXNjYXJnYWRhcy9TZWN1ZW5jaWFzX2dlbkUvR2VuRV85OV9EaXNpbWlsYXJpZGFkX2lkLmNzdiIsIGhlYWRlciA9IEYpCgpHZW5FIDwtIHJlYWQuY3N2KGZpbGUgPSAiL2hvbWUvYW5kcmVhL0xTQi9QaWxvdG9fRGVuZ3VlL2RhdGEvQmFzZV9EYXRvcy9HZW5FLmNzdiIsIGhlYWRlciA9IFQpCgpHZW5FJE5fQWNjZXNpb24gPC0gYXMuY2hhcmFjdGVyKEdlbkUkTl9BY2Nlc2lvbikKCmlkc185OCRWMSA8LSBhcy5jaGFyYWN0ZXIoaWRzXzk4JFYxKQoKaWRzXzk3JFYxIDwtIGFzLmNoYXJhY3RlcihpZHNfOTckVjEpCgppZHNfOTkkVjEgPC0gYXMuY2hhcmFjdGVyKGlkc185OSRWMSkKCiMjIDk3JQoKcG9zaWNpb25fOTcgPC0gdmVjdG9yKCkKCmZvcihpIGluIDE6bGVuZ3RoKGlkc185NyRWMSkpewogIHBvc2ljaW9uXzk3W2ldIDwtIHdoaWNoKEdlbkUkTl9BY2Nlc2lvbj09aWRzXzk3JFYxW2ldKQp9CgpEaXNfOTcgPC0gR2VuRVtwb3NpY2lvbl85NyxdCgp3cml0ZS5jc3YoRGlzXzk3LCBmaWxlID0gIi9ob21lL2FuZHJlYS9MU0IvUGlsb3RvX0Rlbmd1ZS9kYXRhL1NlY3VlbmNpYXNfZGVzY2FyZ2FkYXMvU2VjdWVuY2lhc19nZW5FLy9EaXNpbWlsYXJlczk3LmNzdiIpICAgIAoKRGlzXzk3WywyOjIxXQoKYGBgCioqVGFibGEgMS4qKiBEYXRvcyBkZSBzZWN1ZW5jaWFzIGRlbCBHZW4gRSA5NyUgZGlzaW1pbGFyZXMuCgoKIyMjIFNlY3VlbmNpYXMgZGlzaW1pbGFyZXMgYWwgOTglICMjIwpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA2LGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMjIDk4JQoKcG9zaWNpb25fOTggPC0gdmVjdG9yKCkKCmZvcihpIGluIDE6bGVuZ3RoKGlkc185OCRWMSkpewogIHBvc2ljaW9uXzk4W2ldIDwtIHdoaWNoKEdlbkUkTl9BY2Nlc2lvbj09aWRzXzk4JFYxW2ldKQp9CgpEaXNfOTggPC0gR2VuRVtwb3NpY2lvbl85OCxdCgp3cml0ZS5jc3YoRGlzXzk4LCBmaWxlID0gIi9ob21lL2FuZHJlYS9MU0IvUGlsb3RvX0Rlbmd1ZS9kYXRhL1NlY3VlbmNpYXNfZGVzY2FyZ2FkYXMvU2VjdWVuY2lhc19nZW5FLy9EaXNpbWlsYXJlczk4LmNzdiIpICAgIAoKRGlzXzk4WywyOjIxXQoKYGBgCioqVGFibGEgMi4qKiBEYXRvcyBkZSBzZWN1ZW5jaWFzIGRlbCBHZW4gRSA5OCUgZGlzaW1pbGFyZXMuCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA2LGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCgojIyA5OSUKCnBvc2ljaW9uXzk5IDwtIHZlY3RvcigpCgpmb3IoaSBpbiAxOmxlbmd0aChpZHNfOTkkVjEpKXsKICBwb3NpY2lvbl85OVtpXSA8LSB3aGljaChHZW5FJE5fQWNjZXNpb249PWlkc185OSRWMVtpXSkKfQoKRGlzXzk5IDwtIEdlbkVbcG9zaWNpb25fOTksXQoKd3JpdGUuY3N2KERpc185OSwgZmlsZSA9ICIvaG9tZS9hbmRyZWEvTFNCL1BpbG90b19EZW5ndWUvZGF0YS9TZWN1ZW5jaWFzX2Rlc2NhcmdhZGFzL1NlY3VlbmNpYXNfZ2VuRS8vRGlzaW1pbGFyZXM5OS5jc3YiKSAgICAKCkRpc185OVssMjoyMV0KCgpgYGAKKipUYWJsYSAzLioqIERhdG9zIGRlIHNlY3VlbmNpYXMgZGVsIEdFbiBFIDk5JSBkaXNpbWlsYXJlcy4KCgojIyMgU2Vyb3RpcG9zICMjIwoKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYsZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyA5OAoKRDFfOTggPC0gbGVuZ3RoKERpc185OFtEaXNfOTgkU2Vyb3R5cGU9PSJERU5WXzEiLDVdKQpEMl85OCA8LSBsZW5ndGgoRGlzXzk4W0Rpc185OCRTZXJvdHlwZT09IkRFTlZfMiIsNV0pCkQzXzk4IDwtIGxlbmd0aChEaXNfOThbRGlzXzk4JFNlcm90eXBlPT0iREVOVl8zIiw1XSkKRDRfOTggPC0gbGVuZ3RoKERpc185OFtEaXNfOTgkU2Vyb3R5cGU9PSJERU5WXzQiLDVdKQoKCmRhdGEgPC0gYyggRDFfOTgsIEQyXzk4LCBEM185OCwgRDRfOTgpCgpOYW1lX3Nlcm90eXBlIDwtIHNvcnQodW5pcXVlKERpc185OCRTZXJvdHlwZSkpCgpzZXJvdHlwZV85OCA8LSBkYXRhLmZyYW1lKGRhdGEsIE5hbWVfc2Vyb3R5cGUpCgojIDk3CgpEMV9EIDwtIGxlbmd0aChEaXNfOTdbRGlzXzk3JFNlcm90eXBlPT0iREVOVl8xIiw1XSkKRDJfRCA8LSBsZW5ndGgoRGlzXzk3W0Rpc185NyRTZXJvdHlwZT09IkRFTlZfMiIsNV0pCkQzX0QgPC0gbGVuZ3RoKERpc185N1tEaXNfOTckU2Vyb3R5cGU9PSJERU5WXzMiLDVdKQpENF9EIDwtIGxlbmd0aChEaXNfOTdbRGlzXzk3JFNlcm90eXBlPT0iREVOVl80Iiw1XSkKCgpkYXRhIDwtIGMoIEQxX0QsIEQyX0QsIEQzX0QsIEQ0X0QpCgpOYW1lX3Nlcm90eXBlIDwtIHNvcnQodW5pcXVlKERpc185NyRTZXJvdHlwZSkpCgpzZXJvdHlwZV85NyA8LSBkYXRhLmZyYW1lKGRhdGEsIE5hbWVfc2Vyb3R5cGUpCgojIDk5CgpEMV9EIDwtIGxlbmd0aChEaXNfOTlbRGlzXzk5JFNlcm90eXBlPT0iREVOVl8xIiw1XSkKRDJfRCA8LSBsZW5ndGgoRGlzXzk5W0Rpc185OSRTZXJvdHlwZT09IkRFTlZfMiIsNV0pCkQzX0QgPC0gbGVuZ3RoKERpc185OVtEaXNfOTkkU2Vyb3R5cGU9PSJERU5WXzMiLDVdKQpENF9EIDwtIGxlbmd0aChEaXNfOTlbRGlzXzk5JFNlcm90eXBlPT0iREVOVl80Iiw1XSkKCgpkYXRhIDwtIGMoIEQxX0QsIEQyX0QsIEQzX0QsIEQ0X0QpCgpOYW1lX3Nlcm90eXBlIDwtIHNvcnQodW5pcXVlKERpc185OSRTZXJvdHlwZSkpCgpzZXJvdHlwZV85OSA8LSBkYXRhLmZyYW1lKGRhdGEsIE5hbWVfc2Vyb3R5cGUpCgp0eXBlIDwtIGMoIjk3ICUgRGlzaW1pbGFyaWRhZCIsICI5NyAlIERpc2ltaWxhcmlkYWQiLCAiOTcgJSBEaXNpbWlsYXJpZGFkIiwgIjk3ICUgRGlzaW1pbGFyaWRhZCIsICI5OCAlIERpc2ltaWxhcmlkYWQiLCAiOTggJSBEaXNpbWlsYXJpZGFkIiwgIjk4ICUgRGlzaW1pbGFyaWRhZCIsICI5OCAlIERpc2ltaWxhcmlkYWQiLCAiOTkgJSBEaXNpbWlsYXJpZGFkIiwgIjk5ICUgRGlzaW1pbGFyaWRhZCIsICI5OSAlIERpc2ltaWxhcmlkYWQiLCAiOTkgJSBEaXNpbWlsYXJpZGFkIikKCnNlcm90eXBlIDwtIHJiaW5kKHNlcm90eXBlXzk3LHNlcm90eXBlXzk4LHNlcm90eXBlXzk5KQoKc2Vyb3R5cGUgPC0gY2JpbmQoc2Vyb3R5cGUsdHlwZSkKCmxpYnJhcnkoImdncGxvdDIiKQoKZ2dwbG90KGRhdGEgPSBzZXJvdHlwZSwgYWVzKHg9TmFtZV9zZXJvdHlwZSAsIHkgPSBkYXRhLCBmaWxsPXR5cGUpKSsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrCiAgc2NhbGVfY29sb3VyX2JyZXdlcigpKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCioqRmlndXJhIDEuKiogTnVtZXJvIGRlIGRhdG9zIHBvciBzZXJvdGlwb3MgcGFyYSBsYXMgc2VjdWVuY2lhcyBEaXNpbWlsYXJlcyBhbCA5NywgOTggeSA5OSUKCgojIyMgUGFpc2VzICMjIwpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA2LGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCkNvdW50cnlfbmFtZXMgPC0gdW5pcXVlKERpc185NyRDb3VudHJ5KQoKCmNvdW50cnkuOTc8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBjb3VudHJ5Ljk3W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgY291bnRyeS45N1tpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKERpc185N1t3aGljaChEaXNfOTckQ291bnRyeT09Q291bnRyeV9uYW1lc1tpXSksOV0pCiAgY291bnRyeS45N1syMCwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTckQ291bnRyeSk9PVQpKQp9Cgpjb3VudHJ5Ljk3IDwtIHRyYW5zZm9ybShjb3VudHJ5Ljk3LCBDb3VudHJ5X25hbWVzPSByZW9yZGVyKENvdW50cnlfbmFtZXMsICtudW1iZXJfY2FzZXMpKQoKZ2dwbG90KGRhdGEgPSBjb3VudHJ5Ljk3LCBhZXMoeCA9IENvdW50cnlfbmFtZXMsIHkgPSBudW1iZXJfY2FzZXMsIGNvbG9yPUNvdW50cnlfbmFtZXMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGw9IndoaXRlIikrCiAgbGFicyh4PSAiQ291bnRyeSIsIHk9ICJEYXRhIE51bWJlciIpKwogIHNjYWxlX2NvbG9yX2dyZXkoc3RhcnQ9IDAuNywgZW5kPTAuMSkrCiAgdGhlbWVfY2xhc3NpYygpKwogIGdndGl0bGUoIkRpc2ltaWxhcmVzIDk3JSIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIGNvb3JkX2ZsaXAoKQoKIyBQYWlzZXMgcXVlIGZ1ZXJvbiBlbGltaW5hZG9zOgojIHNldGRpZmYoY291bnRyeS5zaW1pbGFyZXMkQ291bnRyeV9uYW1lcywgY291bnRyeS5kaXNpbWlsYXJlcyRDb3VudHJ5X25hbWVzKQoKYGBgCioqRmlndXJhIDIuKiogUGFpc2VzIHBhcmEgc2VjdWVuY2lhcyBkZSBHZW4gRSA5NyUgZGlzaW1pbGFyZXMuCgpJbmRpYSBDaGluYSBUYWlsYW5kaWEgSW5kb25lc2lhIFNpbmdhcHVyIFZpZXROYW0gRmlsaXBpbmFzIFB1ZXJ0b1JpY28gUGFraXN0YW4gTWFsYXNpYSBNeWFubWFyIEJyYXppbCBBdXN0cmFsaWEgVmVuZXp1ZWxhIEVzdGFkb3NVbmlkb3MgVGltb3IgU29tYWxpYSBQZXJ1IFBhcmFndWF5IE1leGljbyBQb2xpbmVzYUZyYW5jZXNhIENhbWJvZGlhIFllbWVuIFRyaW5pZGFkWVRvYmFnbyBUYWl3YW4gU3JpTGFua2EgU3VyQ29yZWEgQXJhYmlhU2F1ZGl0YSBTYW1vYSBTYW5WaWNlbnRlWUdyYW5hZGFzIFJ1c2lhIE5pZ2VyaWEgTmljYXJhZ3VhIE51ZXZhQ2FsZWRvbmlhIEphcG9uIEd1YW0gRnJhbmNpYSBFY3VhZG9yIENvdGVkdm9pcmUgQmFyYmFkb3MgQmFuZ2xhZGVzaCBBcmdlbnRpbmEKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDgsZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKQ291bnRyeV9uYW1lcyA8LSB1bmlxdWUoRGlzXzk4JENvdW50cnkpCgoKY291bnRyeS45OCA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBjb3VudHJ5Ljk4W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgY291bnRyeS45OFtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKERpc185OFt3aGljaChEaXNfOTgkQ291bnRyeT09Q291bnRyeV9uYW1lc1tpXSksOV0pCiAgY291bnRyeS45OFsxMywgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTgkQ291bnRyeSk9PVQpKQp9Cgpjb3VudHJ5Ljk4IDwtIHRyYW5zZm9ybShjb3VudHJ5Ljk4LCBDb3VudHJ5X25hbWVzPSByZW9yZGVyKENvdW50cnlfbmFtZXMsICtudW1iZXJfY2FzZXMpKQoKZ2dwbG90KGRhdGEgPSBjb3VudHJ5Ljk4LCBhZXMoeCA9IENvdW50cnlfbmFtZXMsIHkgPSBudW1iZXJfY2FzZXMsIGNvbG9yPUNvdW50cnlfbmFtZXMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGw9IndoaXRlIikrCiAgbGFicyh4PSAiQ291bnRyeSIsIHk9ICJEYXRhIE51bWJlciIpKwogIHNjYWxlX2NvbG9yX2dyZXkoc3RhcnQ9IDAuNywgZW5kPTAuMSkrCiAgdGhlbWVfY2xhc3NpYygpKwogIGdndGl0bGUoIkRpc2ltaWxhcmVzIDk4JSIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIGNvb3JkX2ZsaXAoKQoKYGBgCioqRmlndXJhIDMuKiogUGFpc2VzIHBhcmEgc2VjdWVuY2lhcyBkZSBHZW4gRSA5OCUgZGlzaW1pbGFyZXMuCgpJbmRpYSBDaGluYSBUYWlsYW5kaWEgSW5kb25lc2lhIFNpbmdhcHVyIFZpZXROYW0gRmlsaXBpbmFzIFB1ZXJ0b1JpY28gUGFraXN0YW4gTWFsYXNpYSBNeWFubWFyIEJyYXppbCBBdXN0cmFsaWEgVmVuZXp1ZWxhIEVzdGFkb3NVbmlkb3MgVGltb3IgU29tYWxpYSBQZXJ1IFBhcmFndWF5IE1leGljbyBQb2xpbmVzYUZyYW5jZXNhIENhbWJvZGlhIFllbWVuIFRyaW5pZGFkWVRvYmFnbyBUYWl3YW4gU3JpTGFua2EgU3VyQ29yZWEgQXJhYmlhU2F1ZGl0YSBTYW1vYSBTYW5WaWNlbnRlWUdyYW5hZGFzIFJ1c2lhIE5pZ2VyaWEgTmljYXJhZ3VhIE51ZXZhQ2FsZWRvbmlhIEphcG9uIEd1YW0gRnJhbmNpYSBFY3VhZG9yIENvdGVkdm9pcmUgQmFyYmFkb3MgQmFuZ2xhZGVzaCBBcmdlbnRpbmEgUGVydSBIb25kdXJhcyBDb2xvbWJpYSBQYXB1YU51ZXZhR3VpbmVhICBFbFNhbHZhZG9yIElzbGFWaXJnZW4gU3VyRXN0ZUFzaWEgU2FudGFMdWNpYSBNYXJ0aW5pcXVlIExhb3MgSGFpdGkgR3JhbmFkYSBHaGFuYSBGaWppIEFuZ29sYQoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gOSxlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpDb3VudHJ5X25hbWVzIDwtIHVuaXF1ZShEaXNfOTkkQ291bnRyeSkKCgpjb3VudHJ5Ljk5PC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgY291bnRyeS45OVtpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIGNvdW50cnkuOTlbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChEaXNfOTlbd2hpY2goRGlzXzk5JENvdW50cnk9PUNvdW50cnlfbmFtZXNbaV0pLDldKQogIGNvdW50cnkuOTlbMjQsICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgod2hpY2goaXMubmEoRGlzXzk5JENvdW50cnkpPT1UKSkKfQoKY291bnRyeS45OSA8LSB0cmFuc2Zvcm0oY291bnRyeS45OSwgQ291bnRyeV9uYW1lcz0gcmVvcmRlcihDb3VudHJ5X25hbWVzLCArbnVtYmVyX2Nhc2VzKSkKCmdncGxvdChkYXRhID0gY291bnRyeS45OSwgYWVzKHggPSBDb3VudHJ5X25hbWVzLCB5ID0gbnVtYmVyX2Nhc2VzLCBjb2xvcj1Db3VudHJ5X25hbWVzKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsPSJ3aGl0ZSIpKwogIGxhYnMoeD0gIkNvdW50cnkiLCB5PSAiRGF0YSBOdW1iZXIiKSsKICBzY2FsZV9jb2xvcl9ncmV5KHN0YXJ0PSAwLjcsIGVuZD0wLjEpKwogIHRoZW1lX2NsYXNzaWMoKSsKICBnZ3RpdGxlKCJEaXNpbWlsYXJlcyA5OSUiKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBjb29yZF9mbGlwKCkKCiMgUGFpc2VzIHF1ZSBmdWVyb24gZWxpbWluYWRvczoKIyBzZXRkaWZmKGNvdW50cnkuc2ltaWxhcmVzJENvdW50cnlfbmFtZXMsIGNvdW50cnkuZGlzaW1pbGFyZXMkQ291bnRyeV9uYW1lcykKCgpgYGAKKipGaWd1cmEgNC4qKiBQYWlzZXMgcGFyYSBzZWN1ZW5jaWFzIGRlIEdlbiBFIDk5JSBkaXNpbWlsYXJlcy4KCgojIyMgTWFwYS1NdW5kaTogTnVtZXJvIGRlIGNhc29zIHJlcG9ydGFkb3MgcG9yIHBhaXNlcyAgIyMjCgoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTcsZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEZyZWN1ZW5jaWEgZGUgbG9zIHBhaXNlcyBjb24gc3VzIHJlc3BlY3RpdmFzIGNvb3JkZW5hZGFzCiMgU0lOIERJU0NSSU1NSU5BUiBQT1IgU0VST1RJUE9TCgpsaWJyYXJ5KHJ3b3JsZG1hcCkKbGlicmFyeShnZ3Bsb3QyKQoKIyA5OAoKQ291bnRyeV9uYW1lcyA8LSB1bmlxdWUoRGlzXzk4JENvdW50cnkpCgpmcmVnLmNvdW50cnkgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgZnJlZy5kYXRhIDwtIERpc185OFt3aGljaChEaXNfOTgkQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgZnJlZy5jb3VudHJ5W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgZnJlZy5jb3VudHJ5W2ksImxhdCJdIDwtIGZyZWcuZGF0YSRsYXRfY291bnRyeVsxXQogIGZyZWcuY291bnRyeVtpLCJsb24iXSA8LSBmcmVnLmRhdGEkbG9uX2NvdW50cnlbMV0KICBmcmVnLmNvdW50cnlbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChmcmVnLmRhdGEkQ291bnRyeSkKfQoKZnJlZy5jb3VudHJ5IDwtIG5hLm9taXQoZnJlZy5jb3VudHJ5KQoKIyBHUkFGSUNBIE1BUEEtTVVOREkgU0lOIERJRkVSRU5DSUFETyBQT1IgU0VST1RJUE9TCgptYXAud29ybGQgPC0gbWFwX2RhdGEobWFwPSJ3b3JsZCIpCgpwIDwtIGdncGxvdCgpKyAKICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgZ2VvbV9tYXAoZGF0YT1tYXAud29ybGQsIG1hcD1tYXAud29ybGQsIGFlcyhtYXBfaWQ9cmVnaW9uLCB4PWxvbmcsIHk9bGF0KSwgZmlsbD0id2hpdGUiLCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT0wLjUpKwogIGdlb21fcG9pbnQoZGF0YT0gZnJlZy5jb3VudHJ5LCBhZXMoeD1sb24sIHk9bGF0LCBzaXplPW51bWJlcl9jYXNlcyksIGNvbG9yPSJjb3JhbDEiICwgYWxwaGE9MC41KSsKICBnZ3RpdGxlKCJEaXNpc21pbGFyaWRhZCA5OCUiKSsKICBzY2FsZV9zaXplKG5hbWU9Ik51bWJlciBvZiBjYXNlcyIpCgoKIyA5NwoKQ291bnRyeV9uYW1lcyA8LSB1bmlxdWUoRGlzXzk3JENvdW50cnkpCgpmcmVnLmNvdW50cnkgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgZnJlZy5kYXRhIDwtIERpc185N1t3aGljaChEaXNfOTckQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgZnJlZy5jb3VudHJ5W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgZnJlZy5jb3VudHJ5W2ksImxhdCJdIDwtIGZyZWcuZGF0YSRsYXRfY291bnRyeVsxXQogIGZyZWcuY291bnRyeVtpLCJsb24iXSA8LSBmcmVnLmRhdGEkbG9uX2NvdW50cnlbMV0KICBmcmVnLmNvdW50cnlbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChmcmVnLmRhdGEkQ291bnRyeSkKfQoKZnJlZy5jb3VudHJ5IDwtIG5hLm9taXQoZnJlZy5jb3VudHJ5KQoKIyBHUkFGSUNBIE1BUEEtTVVOREkgU0lOIERJRkVSRU5DSUFETyBQT1IgU0VST1RJUE9TCgptYXAud29ybGQgPC0gbWFwX2RhdGEobWFwPSJ3b3JsZCIpCgpwMSA8LSBnZ3Bsb3QoKSsgCiAgI3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMobWFwX2lkPXJlZ2lvbiwgeD1sb25nLCB5PWxhdCksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZW9tX3BvaW50KGRhdGE9IGZyZWcuY291bnRyeSwgYWVzKHg9bG9uLCB5PWxhdCwgc2l6ZT1udW1iZXJfY2FzZXMpLCBjb2xvcj0iY29yYWwxIiAsIGFscGhhPTAuNSkrCiAgZ2d0aXRsZSgiRGlzaXNtaWxhcmlkYWQgOTclIikrCiAgc2NhbGVfc2l6ZShuYW1lPSJOdW1iZXIgb2YgY2FzZXMiKQoKCiMgOTkKCkNvdW50cnlfbmFtZXMgPC0gdW5pcXVlKERpc185OSRDb3VudHJ5KQoKZnJlZy5jb3VudHJ5IDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIGZyZWcuZGF0YSA8LSBEaXNfOTlbd2hpY2goRGlzXzk5JENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIGZyZWcuY291bnRyeVtpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIGZyZWcuY291bnRyeVtpLCJsYXQiXSA8LSBmcmVnLmRhdGEkbGF0X2NvdW50cnlbMV0KICBmcmVnLmNvdW50cnlbaSwibG9uIl0gPC0gZnJlZy5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgZnJlZy5jb3VudHJ5W2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgoZnJlZy5kYXRhJENvdW50cnkpCn0KCmZyZWcuY291bnRyeSA8LSBuYS5vbWl0KGZyZWcuY291bnRyeSkKCiMgR1JBRklDQSBNQVBBLU1VTkRJIFNJTiBESUZFUkVOQ0lBRE8gUE9SIFNFUk9USVBPUwoKbWFwLndvcmxkIDwtIG1hcF9kYXRhKG1hcD0id29ybGQiKQoKcDIgPC0gZ2dwbG90KCkrIAogICN0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKG1hcF9pZD1yZWdpb24sIHg9bG9uZywgeT1sYXQpLCBmaWxsPSJ3aGl0ZSIsIGNvbG91cj0iYmxhY2siLCBzaXplPTAuNSkrCiAgZ2VvbV9wb2ludChkYXRhPSBmcmVnLmNvdW50cnksIGFlcyh4PWxvbiwgeT1sYXQsIHNpemU9bnVtYmVyX2Nhc2VzKSwgY29sb3I9ImNvcmFsMSIgLCBhbHBoYT0wLjUpKwogIGdndGl0bGUoIkRpc2lzbWlsYXJpZGFkIDk5JSIpKwogIHNjYWxlX3NpemUobmFtZT0iTnVtYmVyIG9mIGNhc2VzIikKCgptdWx0aXBsb3QgPC0gZnVuY3Rpb24oLi4uLCBwbG90bGlzdD1OVUxMLCBmaWxlLCBjb2xzPTEsIGxheW91dD1OVUxMKSB7CiAgbGlicmFyeShncmlkKQoKICAjIE1ha2UgYSBsaXN0IGZyb20gdGhlIC4uLiBhcmd1bWVudHMgYW5kIHBsb3RsaXN0CiAgcGxvdHMgPC0gYyhsaXN0KC4uLiksIHBsb3RsaXN0KQoKICBudW1QbG90cyA9IGxlbmd0aChwbG90cykKCiAgIyBJZiBsYXlvdXQgaXMgTlVMTCwgdGhlbiB1c2UgJ2NvbHMnIHRvIGRldGVybWluZSBsYXlvdXQKICBpZiAoaXMubnVsbChsYXlvdXQpKSB7CiAgICAjIE1ha2UgdGhlIHBhbmVsCiAgICAjIG5jb2w6IE51bWJlciBvZiBjb2x1bW5zIG9mIHBsb3RzCiAgICAjIG5yb3c6IE51bWJlciBvZiByb3dzIG5lZWRlZCwgY2FsY3VsYXRlZCBmcm9tICMgb2YgY29scwogICAgbGF5b3V0IDwtIG1hdHJpeChzZXEoMSwgY29scyAqIGNlaWxpbmcobnVtUGxvdHMvY29scykpLAogICAgICAgICAgICAgICAgICAgIG5jb2wgPSBjb2xzLCBucm93ID0gY2VpbGluZyhudW1QbG90cy9jb2xzKSkKICB9CgogaWYgKG51bVBsb3RzPT0xKSB7CiAgICBwcmludChwbG90c1tbMV1dKQoKICB9IGVsc2UgewogICAgIyBTZXQgdXAgdGhlIHBhZ2UKICAgIGdyaWQubmV3cGFnZSgpCiAgICBwdXNoVmlld3BvcnQodmlld3BvcnQobGF5b3V0ID0gZ3JpZC5sYXlvdXQobnJvdyhsYXlvdXQpLCBuY29sKGxheW91dCkpKSkKCiAgICAjIE1ha2UgZWFjaCBwbG90LCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbgogICAgZm9yIChpIGluIDE6bnVtUGxvdHMpIHsKICAgICAgIyBHZXQgdGhlIGksaiBtYXRyaXggcG9zaXRpb25zIG9mIHRoZSByZWdpb25zIHRoYXQgY29udGFpbiB0aGlzIHN1YnBsb3QKICAgICAgbWF0Y2hpZHggPC0gYXMuZGF0YS5mcmFtZSh3aGljaChsYXlvdXQgPT0gaSwgYXJyLmluZCA9IFRSVUUpKQoKICAgICAgcHJpbnQocGxvdHNbW2ldXSwgdnAgPSB2aWV3cG9ydChsYXlvdXQucG9zLnJvdyA9IG1hdGNoaWR4JHJvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQucG9zLmNvbCA9IG1hdGNoaWR4JGNvbCkpCiAgICB9CiAgfQp9CgoKbXVsdGlwbG90KHAxLHAscDIpCgpgYGAKKipGaWd1cmEgNS4qKiBOdW1lcm8gZGUgY2Fzb3MgcmVwb3J0YWRvcyBwb3IgcGFpc2VzLgoKCiMjIyBNYXBhLW11bmRpOiBTZXJvdGlwb3MgcG9yIHBhaXNlcyAjIyMKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNixlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIDk3CgpDb3VudHJ5X25hbWVzIDwtIG5hLm9taXQodW5pcXVlKERpc185NyRDb3VudHJ5KSkKCiMgRnJlY3VlbmNpYSBkZSBsb3Mgc2Vyb3RpcG9zIGVuIGxvcyBwYWlzZXMgcmVnaXN0cmFkb3M6IAoKIyBTRVJPVElQTyAxCgptdW5kaWRfMSA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk3W3doaWNoKERpc185NyRTZXJvdHlwZSA9PSAiREVOVl8xIiAmIERpc185NyRDb3VudHJ5ID09IENvdW50cnlfbmFtZXNbaV0pLF0KICBtdW5kaWRfMVtpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBtdW5kaWRfMVtpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIG11bmRpZF8xW2ksImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfY291bnRyeVsxXQogIG11bmRpZF8xW2ksImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fY291bnRyeVsxXQogIG11bmRpZF8xW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJENvdW50cnkpCn0KCiNTRVJPVElQTyAyCgptdW5kaWRfMiA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk3W3doaWNoKERpc185NyRTZXJvdHlwZSA9PSAiREVOVl8yIiAmIERpc185NyRDb3VudHJ5ID09IENvdW50cnlfbmFtZXNbaV0pLF0KICBtdW5kaWRfMltpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBtdW5kaWRfMltpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIG11bmRpZF8yW2ksImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfY291bnRyeVsxXQogIG11bmRpZF8yW2ksImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fY291bnRyeVsxXQogIG11bmRpZF8yW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJENvdW50cnkpCn0KCgojU0VST1RJUE8gMwoKbXVuZGlkXzMgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgbWluaS5kYXRhIDwtIERpc185N1t3aGljaChEaXNfOTckU2Vyb3R5cGUgPT0gIkRFTlZfMyIgJiBEaXNfOTckQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgbXVuZGlkXzNbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgbXVuZGlkXzNbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBtdW5kaWRfM1tpLCJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2NvdW50cnlbMV0KICBtdW5kaWRfM1tpLCJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2NvdW50cnlbMV0KICBtdW5kaWRfM1tpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRDb3VudHJ5KQp9CgoKI1NFUk9USVBPIDQKCm11bmRpZF80IDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBEaXNfOTdbd2hpY2goRGlzXzk3JFNlcm90eXBlID09ICJERU5WXzQiICYgRGlzXzk3JENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZF80W2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZF80W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlkXzRbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlkXzRbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlkXzRbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKCgpkYXRhLm11bmRpIDwtIHJiaW5kKG11bmRpZF8xLG11bmRpZF8yLG11bmRpZF8zLG11bmRpZF80KQpkYXRhLm11bmRpIDwtIG5hLm9taXQoZGF0YS5tdW5kaSkKCiMgR1JBRklDQSBNQVBBLU1VTkRJIERJRkVSRU5DSUFETyBQT1IgU0VST1RJUE9TCgptYXAud29ybGQgPC0gbWFwX2RhdGEobWFwPSJ3b3JsZCIpCgptcDEgPC0gZ2dwbG90KCkrIAogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMobWFwX2lkPXJlZ2lvbiwgeD1sb25nLCB5PWxhdCksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZ3RpdGxlKCJQYWlzZXM6IERpc2ltaWxhcmlkYWQgOTclIikrCiAgZ2VvbV9wb2ludChkYXRhPSBkYXRhLm11bmRpLCBhZXMoeD1sb24sIHk9bGF0LCBjb2xvcj1TZXJvdHlwZSksc2l6ZT0xLjUsIGFscGhhPTAuNSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJ0dXJxdW9pc2UzIiwiZGVlcHBpbmsiLCJtZWRpdW1ibHVlIiwiZ3JlZW4zIikpCgptcDEKCmBgYAoqKkZpZ3VyYSA2LioqIERpc3RyaWJ1Y2lvbiBkZSBsb3Mgc2Vyb3RpcG9zIHBvciBwYWlzZXMgcGFyYSBzZWN1ZW5jaWFzIDk3JSBkaXNpbWlsYXJlcy4KCgoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNixlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIDk4CgpDb3VudHJ5X25hbWVzIDwtIG5hLm9taXQodW5pcXVlKERpc185OCRDb3VudHJ5KSkKCiMgRnJlY3VlbmNpYSBkZSBsb3Mgc2Vyb3RpcG9zIGVuIGxvcyBwYWlzZXMgcmVnaXN0cmFkb3M6IAoKIyBTRVJPVElQTyAxCgptdW5kaXNfMSA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk4W3doaWNoKERpc185OCRTZXJvdHlwZSA9PSAiREVOVl8xIiAmIERpc185OCRDb3VudHJ5ID09IENvdW50cnlfbmFtZXNbaV0pLF0KICBtdW5kaXNfMVtpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBtdW5kaXNfMVtpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIG11bmRpc18xW2ksImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfY291bnRyeVsxXQogIG11bmRpc18xW2ksImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fY291bnRyeVsxXQogIG11bmRpc18xW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJENvdW50cnkpCn0KCiNTRVJPVElQTyAyCgptdW5kaXNfMiA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk4W3doaWNoKERpc185OCRTZXJvdHlwZSA9PSAiREVOVl8yIiAmIERpc185OCRDb3VudHJ5ID09IENvdW50cnlfbmFtZXNbaV0pLF0KICBtdW5kaXNfMltpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBtdW5kaXNfMltpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIG11bmRpc18yW2ksImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfY291bnRyeVsxXQogIG11bmRpc18yW2ksImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fY291bnRyeVsxXQogIG11bmRpc18yW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJENvdW50cnkpCn0KCgojU0VST1RJUE8gMwoKbXVuZGlzXzMgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgbWluaS5kYXRhIDwtIERpc185OFt3aGljaChEaXNfOTgkU2Vyb3R5cGUgPT0gIkRFTlZfMyIgJiBEaXNfOTgkQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgbXVuZGlzXzNbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgbXVuZGlzXzNbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBtdW5kaXNfM1tpLCJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2NvdW50cnlbMV0KICBtdW5kaXNfM1tpLCJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2NvdW50cnlbMV0KICBtdW5kaXNfM1tpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRDb3VudHJ5KQp9CgoKI1NFUk9USVBPIDQKCm11bmRpc180IDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBEaXNfOThbd2hpY2goRGlzXzk4JFNlcm90eXBlID09ICJERU5WXzQiICYgRGlzXzk4JENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpc180W2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpc180W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlzXzRbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlzXzRbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlzXzRbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKCgpkYXRhLm11bmRpIDwtIHJiaW5kKG11bmRpc18xLG11bmRpc18yLG11bmRpc18zLG11bmRpc180KQpkYXRhLm11bmRpIDwtIG5hLm9taXQoZGF0YS5tdW5kaSkKCiMgR1JBRklDQSBNQVBBLU1VTkRJIERJRkVSRU5DSUFETyBQT1IgU0VST1RJUE9TCgptYXAud29ybGQgPC0gbWFwX2RhdGEobWFwPSJ3b3JsZCIpCgptcCA8LWdncGxvdCgpKyAKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKG1hcF9pZD1yZWdpb24sIHg9bG9uZywgeT1sYXQpLCBmaWxsPSJ3aGl0ZSIsIGNvbG91cj0iYmxhY2siLCBzaXplPTAuNSkrCiAgZ2d0aXRsZSgiUGFpc2VzOiBEaXNpbWlsYXJpZGFkIDk4JSIpKwogIGdlb21fcG9pbnQoZGF0YT0gZGF0YS5tdW5kaSwgYWVzKHg9bG9uLCB5PWxhdCwgY29sb3I9U2Vyb3R5cGUpLHNpemU9MS41LCBhbHBoYT0wLjUpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygidHVycXVvaXNlMyIsImRlZXBwaW5rIiwibWVkaXVtYmx1ZSIsImdyZWVuMyIpKQoKbXAKCmBgYAoqKkZpZ3VyYSA3LioqIERpc3RyaWJ1Y2lvbiBkZSBsb3Mgc2Vyb3RpcG9zIHBvciBwYWlzZXMgcGFyYSBzZWN1ZW5jaWFzIDk4JSBkaXNpbWlsYXJlcy4KCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYsZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyA5OQoKQ291bnRyeV9uYW1lcyA8LSBuYS5vbWl0KHVuaXF1ZShEaXNfOTkkQ291bnRyeSkpCgojIEZyZWN1ZW5jaWEgZGUgbG9zIHNlcm90aXBvcyBlbiBsb3MgcGFpc2VzIHJlZ2lzdHJhZG9zOiAKCiMgU0VST1RJUE8gMQoKbXVuZGlkXzEgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgbWluaS5kYXRhIDwtIERpc185OVt3aGljaChEaXNfOTkkU2Vyb3R5cGUgPT0gIkRFTlZfMSIgJiBEaXNfOTkkQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgbXVuZGlkXzFbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgbXVuZGlkXzFbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBtdW5kaWRfMVtpLCJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2NvdW50cnlbMV0KICBtdW5kaWRfMVtpLCJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2NvdW50cnlbMV0KICBtdW5kaWRfMVtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRDb3VudHJ5KQp9CgojU0VST1RJUE8gMgoKbXVuZGlkXzIgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgbWluaS5kYXRhIDwtIERpc185OVt3aGljaChEaXNfOTkkU2Vyb3R5cGUgPT0gIkRFTlZfMiIgJiBEaXNfOTkkQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgbXVuZGlkXzJbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgbXVuZGlkXzJbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBtdW5kaWRfMltpLCJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2NvdW50cnlbMV0KICBtdW5kaWRfMltpLCJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2NvdW50cnlbMV0KICBtdW5kaWRfMltpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRDb3VudHJ5KQp9CgoKI1NFUk9USVBPIDMKCm11bmRpZF8zIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBEaXNfOTlbd2hpY2goRGlzXzk5JFNlcm90eXBlID09ICJERU5WXzMiICYgRGlzXzk5JENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZF8zW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZF8zW2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlkXzNbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlkXzNbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlkXzNbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKCiNTRVJPVElQTyA0CgptdW5kaWRfNCA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk5W3doaWNoKERpc185OSRTZXJvdHlwZSA9PSAiREVOVl80IiAmIERpc185OSRDb3VudHJ5ID09IENvdW50cnlfbmFtZXNbaV0pLF0KICBtdW5kaWRfNFtpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBtdW5kaWRfNFtpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIG11bmRpZF80W2ksImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfY291bnRyeVsxXQogIG11bmRpZF80W2ksImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fY291bnRyeVsxXQogIG11bmRpZF80W2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJENvdW50cnkpCn0KCgoKZGF0YS5tdW5kaTIgPC0gcmJpbmQobXVuZGlkXzEsbXVuZGlkXzIsbXVuZGlkXzMsbXVuZGlkXzQpCmRhdGEubXVuZGkyIDwtIG5hLm9taXQoZGF0YS5tdW5kaSkKCiMgR1JBRklDQSBNQVBBLU1VTkRJIERJRkVSRU5DSUFETyBQT1IgU0VST1RJUE9TCgptYXAud29ybGQgPC0gbWFwX2RhdGEobWFwPSJ3b3JsZCIpCgptcDIgPC0gZ2dwbG90KCkrIAogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMobWFwX2lkPXJlZ2lvbiwgeD1sb25nLCB5PWxhdCksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZ3RpdGxlKCJQYWlzZXM6IERpc2ltaWxhcmlkYWQgOTklIikrCiAgZ2VvbV9wb2ludChkYXRhPSBkYXRhLm11bmRpMiwgYWVzKHg9bG9uLCB5PWxhdCwgY29sb3I9U2Vyb3R5cGUpLHNpemU9MS41LCBhbHBoYT0wLjUpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygidHVycXVvaXNlMyIsImRlZXBwaW5rIiwibWVkaXVtYmx1ZSIsImdyZWVuMyIpKQoKCm1wMgoKYGBgCioqRmlndXJhIDguKiogRGlzdHJpYnVjaW9uIGRlIGxvcyBzZXJvdGlwb3MgcG9yIHBhaXNlcyBwYXJhIHNlY3VlbmNpYXMgOTklIGRpc2ltaWxhcmVzLgoKCiMjIyBMb2NhbGlkYWRlczogRGlzaW1pbGFyaWRhZCA5NyUgIyMjCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD01LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKbGlicmFyeSh0bSkKbGlicmFyeShTbm93YmFsbEMpCmxpYnJhcnkod29yZGNsb3VkKQpsaWJyYXJ5KCJSQ29sb3JCcmV3ZXIiKQoKbG9jYXRpb24gPC0gRGlzXzk3W3doaWNoKGlzLm5hKERpc185NyRMb2NhdGlvbik9PUYpLDEwXQoKbG9jYXRpb24gPC0gZ3N1YigiICIsICIiLCBsb2NhdGlvbikKCmxvY29ycHVzIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UobG9jYXRpb24pKQoKdG9TcGFjZSA8LSBjb250ZW50X3RyYW5zZm9ybWVyKGZ1bmN0aW9uICh4ICwgcGF0dGVybiApIGdzdWIocGF0dGVybiwgIiAiLCB4KSkKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCB0b1NwYWNlLCAiLyIpCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgdG9TcGFjZSwgIi0iKQpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHRvU3BhY2UsICItLSIpCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIGNvbnRlbnRfdHJhbnNmb3JtZXIodG9sb3dlcikpCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHJlbW92ZU51bWJlcnMpCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoJ2VuZ2xpc2gnKSkKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgcmVtb3ZlV29yZHMsIGMoImJsYWJsYTEiLCAiYmxhYmxhMiIpKSAKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgcmVtb3ZlUHVuY3R1YXRpb24pCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHN0cmlwV2hpdGVzcGFjZSkKCmR0bSA8LSBUZXJtRG9jdW1lbnRNYXRyaXgobG9jb3JwdXMpCmxvbWF4IDwtIGFzLm1hdHJpeChkdG0pCnZjYXRpb24gPC0gc29ydChyb3dTdW1zKGxvbWF4KSxkZWNyZWFzaW5nPVRSVUUpCmxvZnJhbWUgPC0gZGF0YS5mcmFtZSh3b3JkID0gbmFtZXModmNhdGlvbiksZnJlcT12Y2F0aW9uKQoKCndvcmRjbG91ZCh3b3JkcyA9IGxvZnJhbWUkd29yZCwgZnJlcSA9IGxvZnJhbWUkZnJlcSwgc2NhbGUgPSBjKDQsMSksIG1pbi5mcmVxID0gMiwKICAgICAgICAgIG1heC53b3Jkcz0yMDAwLCByYW5kb20ub3JkZXI9RkFMU0UsIHJvdC5wZXI9MC40NSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDEyLCAiUGFpcmVkIikpCgoKYGBgCioqRmlndXJhIDkuKiogTnViZSBkZSBsb2NhbGlkYWRlcyBwYXJhIHNlY3VlY2lhcyBkZWwgR2VuIEUgOTclIERpc2ltaWxhcmVzLgoKIyMjIExvY2FsaWRhZGVzOiBEaXNpbWlsYXJpZGFkIDk4JSAjIyMKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpsaWJyYXJ5KHRtKQpsaWJyYXJ5KFNub3diYWxsQykKbGlicmFyeSh3b3JkY2xvdWQpCmxpYnJhcnkoIlJDb2xvckJyZXdlciIpCgpsb2NhdGlvbiA8LSBEaXNfOThbd2hpY2goaXMubmEoRGlzXzk4JExvY2F0aW9uKT09RiksMTBdCgpsb2NhdGlvbiA8LSBnc3ViKCIgIiwgIiIsIGxvY2F0aW9uKQoKbG9jb3JwdXMgPC0gQ29ycHVzKFZlY3RvclNvdXJjZShsb2NhdGlvbikpCgp0b1NwYWNlIDwtIGNvbnRlbnRfdHJhbnNmb3JtZXIoZnVuY3Rpb24gKHggLCBwYXR0ZXJuICkgZ3N1YihwYXR0ZXJuLCAiICIsIHgpKQpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHRvU3BhY2UsICIvIikKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCB0b1NwYWNlLCAiLSIpCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgdG9TcGFjZSwgIi0tIikKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcih0b2xvd2VyKSkKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgcmVtb3ZlTnVtYmVycykKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygnZW5nbGlzaCcpKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVXb3JkcywgYygiYmxhYmxhMSIsICJibGFibGEyIikpIAoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVQdW5jdHVhdGlvbikKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgc3RyaXBXaGl0ZXNwYWNlKQoKZHRtIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChsb2NvcnB1cykKbG9tYXggPC0gYXMubWF0cml4KGR0bSkKdmNhdGlvbiA8LSBzb3J0KHJvd1N1bXMobG9tYXgpLGRlY3JlYXNpbmc9VFJVRSkKbG9mcmFtZSA8LSBkYXRhLmZyYW1lKHdvcmQgPSBuYW1lcyh2Y2F0aW9uKSxmcmVxPXZjYXRpb24pCgoKd29yZGNsb3VkKHdvcmRzID0gbG9mcmFtZSR3b3JkLCBmcmVxID0gbG9mcmFtZSRmcmVxLCBzY2FsZSA9IGMoNCwxKSwgbWluLmZyZXEgPSAyLAogICAgICAgICAgbWF4LndvcmRzPTIwMDAsIHJhbmRvbS5vcmRlcj1GQUxTRSwgcm90LnBlcj0wLjQ1LAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoMTIsICJQYWlyZWQiKSkKCgpgYGAKKipGaWd1cmEgMTAuKiogTnViZSBkZSBsb2NhbGlkYWRlcyBwYXJhIHNlY3VlY2lhcyBkZWwgR2VuIEUgOTglIERpc2ltaWxhcmVzLgoKIyMjIExvY2FsaWRhZGVzOiBEaXNpbWlsYXJpZGFkIDk5JSAjIyMKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpsaWJyYXJ5KHRtKQpsaWJyYXJ5KFNub3diYWxsQykKbGlicmFyeSh3b3JkY2xvdWQpCmxpYnJhcnkoIlJDb2xvckJyZXdlciIpCgpsb2NhdGlvbiA8LSBEaXNfOTlbd2hpY2goaXMubmEoRGlzXzk5JExvY2F0aW9uKT09RiksMTBdCgpsb2NhdGlvbiA8LSBnc3ViKCIgIiwgIiIsIGxvY2F0aW9uKQoKbG9jb3JwdXMgPC0gQ29ycHVzKFZlY3RvclNvdXJjZShsb2NhdGlvbikpCgp0b1NwYWNlIDwtIGNvbnRlbnRfdHJhbnNmb3JtZXIoZnVuY3Rpb24gKHggLCBwYXR0ZXJuICkgZ3N1YihwYXR0ZXJuLCAiICIsIHgpKQpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHRvU3BhY2UsICIvIikKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCB0b1NwYWNlLCAiLSIpCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgdG9TcGFjZSwgIi0tIikKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcih0b2xvd2VyKSkKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgcmVtb3ZlTnVtYmVycykKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgcmVtb3ZlV29yZHMsIHN0b3B3b3JkcygnZW5nbGlzaCcpKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVXb3JkcywgYygiYmxhYmxhMSIsICJibGFibGEyIikpIAoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVQdW5jdHVhdGlvbikKCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgc3RyaXBXaGl0ZXNwYWNlKQoKZHRtIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChsb2NvcnB1cykKbG9tYXggPC0gYXMubWF0cml4KGR0bSkKdmNhdGlvbiA8LSBzb3J0KHJvd1N1bXMobG9tYXgpLGRlY3JlYXNpbmc9VFJVRSkKbG9mcmFtZSA8LSBkYXRhLmZyYW1lKHdvcmQgPSBuYW1lcyh2Y2F0aW9uKSxmcmVxPXZjYXRpb24pCgoKd29yZGNsb3VkKHdvcmRzID0gbG9mcmFtZSR3b3JkLCBmcmVxID0gbG9mcmFtZSRmcmVxLCBzY2FsZSA9IGMoNCwxKSwgbWluLmZyZXEgPSAyLAogICAgICAgICAgbWF4LndvcmRzPTIwMDAsIHJhbmRvbS5vcmRlcj1GQUxTRSwgcm90LnBlcj0wLjQ1LAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoMTIsICJQYWlyZWQiKSkKCgpgYGAKKipGaWd1cmEgMTEuKiogTnViZSBkZSBsb2NhbGlkYWRlcyBwYXJhIHNlY3VlY2lhcyBkZWwgR2VuIEUgOTklIERpc2ltaWxhcmVzLgoKCiMjIyBNYXBhLW11bmRpIGxvY2FsaWRhZGVzIDk3JSBEaXNpbWlsYXJpZGFkICMjIwoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cgpsb2NhdGlvbiA8LSB3aGljaChpcy5uYShEaXNfOTckTG9jYXRpb24pPT1GKQoKbmFtZXNfbG9jYXRpb24gPC0gdW5pcXVlKERpc185N1t3aGljaChpcy5uYShEaXNfOTckTG9jYXRpb24pPT1GKSwxMF0pCgpsb2NhdGlvbl9jb3VudHJ5X2FsbCA8LSB2ZWN0b3IoKQoKZm9yKGkgaW4gMTpsZW5ndGgobG9jYXRpb24pKXsKICBsb2NhdGlvbl9jb3VudHJ5X2FsbFtpXSA8LSAgcGFzdGUoRGlzXzk3JExvY2F0aW9uW2xvY2F0aW9uW2ldXSwiLCIsRGlzXzk3JENvdW50cnlbbG9jYXRpb25baV1dLCBzZXAgPSAiIikKfQoKCmxvY2F0aW9uX2NvdW50cnkgPC0gdW5pcXVlKGxvY2F0aW9uX2NvdW50cnlfYWxsKQoKIyBTRVJPVElQTyAxCgpTRDEgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChuYW1lc19sb2NhdGlvbikpewogIG1pbmkuZGF0YSA8LSBEaXNfOTdbd2hpY2goRGlzXzk3JFNlcm90eXBlPT0iREVOVl8xIiAmIERpc185NyRMb2NhdGlvbj09bmFtZXNfbG9jYXRpb25baV0pLF0KICBTRDFbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgU0QxW2ksImxvY2F0aW9uX25hbWVzIl0gPC0gbG9jYXRpb25fY291bnRyeVtpXQogIFNEMVtpLCAibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9sb2NhdGlvblsxXQogIFNEMVtpLCAibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9sb2NhdGlvblsxXQogIFNEMVtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRMb2NhdGlvbikKfQoKU0QxPC0gbmEub21pdChTRDEpCgojIFNFUk9USVBPIDIKClNEMiA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIERpc185N1t3aGljaChEaXNfOTckU2Vyb3R5cGU9PSJERU5WXzIiICYgRGlzXzk3JExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNEMltpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTRDJbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU0QyW2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU0QyW2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU0QyW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTRDI8LSBuYS5vbWl0KFNEMikKCiMgU0VST1RJUEUgMwoKU0QzIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk3W3doaWNoKERpc185NyRTZXJvdHlwZT09IkRFTlZfMyIgJiBEaXNfOTckTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU0QzW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNEM1tpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTRDNbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTRDNbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTRDNbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNEMzwtIG5hLm9taXQoU0QzKQoKIyBTRVJPVElQRSA0CgpTRDQgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChuYW1lc19sb2NhdGlvbikpewogIG1pbmkuZGF0YSA8LSBEaXNfOTdbd2hpY2goRGlzXzk3JFNlcm90eXBlPT0iREVOVl80IiAmIERpc185NyRMb2NhdGlvbj09bmFtZXNfbG9jYXRpb25baV0pLF0KICBTRDRbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgU0Q0W2ksImxvY2F0aW9uX25hbWVzIl0gPC0gbG9jYXRpb25fY291bnRyeVtpXQogIFNENFtpLCAibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9sb2NhdGlvblsxXQogIFNENFtpLCAibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9sb2NhdGlvblsxXQogIFNENFtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRMb2NhdGlvbikKfQoKU0Q0PC0gbmEub21pdChTRDQpCgptdW5kaS5sb2NhdGlvbiA8LSByYmluZChTRDEsU0QyLFNEMyxTRDQpCgoKIyBHUkFGSUNBIE1BUEEtTVVOREkgRElGRVJFTkNJQURPIFBPUiBTRVJPVElQT1MKCm1hcC53b3JsZCA8LSBtYXBfZGF0YShtYXA9IndvcmxkIikKCmdncGxvdCgpKyAKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKG1hcF9pZD1yZWdpb24sIHg9bG9uZywgeT1sYXQpLCBmaWxsPSJ3aGl0ZSIsIGNvbG91cj0iYmxhY2siLCBzaXplPTAuNSkrCiAgZ2VvbV9wb2ludChkYXRhPSBtdW5kaS5sb2NhdGlvbiwgYWVzKHg9bG9uLCB5PWxhdCwgY29sb3I9U2Vyb3R5cGUpLHNpemU9MS41LCBhbHBoYT0wLjUpKwogIGdndGl0bGUoIkxvY2FsaWRhZGVzOiBEaXNpbWlsYXJpZGFkIDk3JSIpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygidHVycXVvaXNlMyIsImRlZXBwaW5rIiwibWVkaXVtYmx1ZSIsImdyZWVuMyIpKQoKCmBgYAoqKkZpZ3VyYSAxMi4qKiBMb2NhbGlkYWRlcyBkZSBzZWN1ZW5jaWFzIGRlbCBHZW4gRSA5NyUgZGlzaW1pbGFyZXMuCgoKIyMjIE1hcGEtbXVuZGkgbG9jYWxpZGFkZXMgOTglIERpc2ltaWxhcmlkYWQgIyMjCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9NiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmxvY2F0aW9uIDwtIHdoaWNoKGlzLm5hKERpc185OCRMb2NhdGlvbik9PUYpCgpuYW1lc19sb2NhdGlvbiA8LSB1bmlxdWUoRGlzXzk4W3doaWNoKGlzLm5hKERpc185OCRMb2NhdGlvbik9PUYpLDEwXSkKCmxvY2F0aW9uX2NvdW50cnlfYWxsIDwtIHZlY3RvcigpCgpmb3IoaSBpbiAxOmxlbmd0aChsb2NhdGlvbikpewogIGxvY2F0aW9uX2NvdW50cnlfYWxsW2ldIDwtICBwYXN0ZShEaXNfOTgkTG9jYXRpb25bbG9jYXRpb25baV1dLCIsIixEaXNfOTgkQ291bnRyeVtsb2NhdGlvbltpXV0sIHNlcCA9ICIiKQp9CgoKbG9jYXRpb25fY291bnRyeSA8LSB1bmlxdWUobG9jYXRpb25fY291bnRyeV9hbGwpCgojIFNFUk9USVBPIDEKClNTMSA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIERpc185OFt3aGljaChEaXNfOTgkU2Vyb3R5cGU9PSJERU5WXzEiICYgRGlzXzk4JExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNTMVtpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTUzFbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU1MxW2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU1MxW2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU1MxW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTUzEgPC0gbmEub21pdChTUzEpCgojIFNFUk9USVBPIDIKClNTMiA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIERpc185OFt3aGljaChEaXNfOTgkU2Vyb3R5cGU9PSJERU5WXzIiICYgRGlzXzk4JExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNTMltpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTUzJbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU1MyW2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU1MyW2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU1MyW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTUzIgPC0gbmEub21pdChTUzIpCgojIFNFUk9USVBFIDMKClNTMyA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIERpc185OFt3aGljaChEaXNfOTgkU2Vyb3R5cGU9PSJERU5WXzMiICYgRGlzXzk4JExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNTM1tpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTUzNbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU1MzW2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU1MzW2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU1MzW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTUzMgPC0gbmEub21pdChTUzMpCgojIFNFUk9USVBFIDQKClNTNCA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIERpc185OFt3aGljaChEaXNfOTgkU2Vyb3R5cGU9PSJERU5WXzQiICYgRGlzXzk4JExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNTNFtpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTUzRbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU1M0W2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU1M0W2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU1M0W2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTUzQgPC0gbmEub21pdChTUzQpCgptdW5kaS5sb2NhdGlvbiA8LSByYmluZChTUzEsU1MyLFNTMyxTUzQpCgoKIyBHUkFGSUNBIE1BUEEtTVVOREkgRElGRVJFTkNJQURPIFBPUiBTRVJPVElQT1MKCm1hcC53b3JsZCA8LSBtYXBfZGF0YShtYXA9IndvcmxkIikKCmdncGxvdCgpKyAKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKG1hcF9pZD1yZWdpb24sIHg9bG9uZywgeT1sYXQpLCBmaWxsPSJ3aGl0ZSIsIGNvbG91cj0iYmxhY2siLCBzaXplPTAuNSkrCiAgZ2VvbV9wb2ludChkYXRhPSBtdW5kaS5sb2NhdGlvbiwgYWVzKHg9bG9uLCB5PWxhdCwgY29sb3I9U2Vyb3R5cGUpLHNpemU9MS41LCBhbHBoYT0wLjUpKwogIGdndGl0bGUoIkxvY2FsaWRhZXM6IDk4JSBEaXNpbWlsYXJpZGFkIikrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJ0dXJxdW9pc2UzIiwiZGVlcHBpbmsiLCJtZWRpdW1ibHVlIiwiZ3JlZW4zIikpCgoKCgpgYGAKKipGaWd1cmEgMTMuKiogTG9jYWxpZGFkZXMgZGUgc2VjdWVuY2lhcyBkZWwgR2VuIEUgOTglIGRpc2ltaWxhcmVzLgoKIyMjIE1hcGEtbXVuZGkgbG9jYWxpZGFkZXMgOTklIERpc2ltaWxhcmlkYWQgIyMjCmBgYHtyLCBlY2hvID0gRkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKbG9jYXRpb24gPC0gd2hpY2goaXMubmEoRGlzXzk5JExvY2F0aW9uKT09RikKCm5hbWVzX2xvY2F0aW9uIDwtIHVuaXF1ZShEaXNfOTlbd2hpY2goaXMubmEoRGlzXzk5JExvY2F0aW9uKT09RiksMTBdKQoKbG9jYXRpb25fY291bnRyeV9hbGwgPC0gdmVjdG9yKCkKCmZvcihpIGluIDE6bGVuZ3RoKGxvY2F0aW9uKSl7CiAgbG9jYXRpb25fY291bnRyeV9hbGxbaV0gPC0gIHBhc3RlKERpc185OSRMb2NhdGlvbltsb2NhdGlvbltpXV0sIiwiLERpc185OSRDb3VudHJ5W2xvY2F0aW9uW2ldXSwgc2VwID0gIiIpCn0KCgpsb2NhdGlvbl9jb3VudHJ5IDwtIHVuaXF1ZShsb2NhdGlvbl9jb3VudHJ5X2FsbCkKCiMgU0VST1RJUE8gMQoKU0QxIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk5W3doaWNoKERpc185OSRTZXJvdHlwZT09IkRFTlZfMSIgJiBEaXNfOTkkTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU0QxW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNEMVtpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTRDFbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTRDFbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTRDFbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNEMTwtIG5hLm9taXQoU0QxKQoKIyBTRVJPVElQTyAyCgpTRDIgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChuYW1lc19sb2NhdGlvbikpewogIG1pbmkuZGF0YSA8LSBEaXNfOTlbd2hpY2goRGlzXzk5JFNlcm90eXBlPT0iREVOVl8yIiAmIERpc185OSRMb2NhdGlvbj09bmFtZXNfbG9jYXRpb25baV0pLF0KICBTRDJbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgU0QyW2ksImxvY2F0aW9uX25hbWVzIl0gPC0gbG9jYXRpb25fY291bnRyeVtpXQogIFNEMltpLCAibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9sb2NhdGlvblsxXQogIFNEMltpLCAibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9sb2NhdGlvblsxXQogIFNEMltpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRMb2NhdGlvbikKfQoKU0QyPC0gbmEub21pdChTRDIpCgojIFNFUk9USVBFIDMKClNEMyA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIERpc185OVt3aGljaChEaXNfOTkkU2Vyb3R5cGU9PSJERU5WXzMiICYgRGlzXzk5JExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNEM1tpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTRDNbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU0QzW2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU0QzW2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU0QzW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTRDM8LSBuYS5vbWl0KFNEMykKCiMgU0VST1RJUEUgNAoKU0Q0IDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gRGlzXzk5W3doaWNoKERpc185OSRTZXJvdHlwZT09IkRFTlZfNCIgJiBEaXNfOTkkTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU0Q0W2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNENFtpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTRDRbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTRDRbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTRDRbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNENDwtIG5hLm9taXQoU0Q0KQoKbXVuZGkubG9jYXRpb24xIDwtIHJiaW5kKFNEMSxTRDIsU0QzLFNENCkKCgojIEdSQUZJQ0EgTUFQQS1NVU5ESSBESUZFUkVOQ0lBRE8gUE9SIFNFUk9USVBPUwoKbWFwLndvcmxkIDwtIG1hcF9kYXRhKG1hcD0id29ybGQiKQoKZ2dwbG90KCkrIAogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMobWFwX2lkPXJlZ2lvbiwgeD1sb25nLCB5PWxhdCksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZW9tX3BvaW50KGRhdGE9IG11bmRpLmxvY2F0aW9uMSwgYWVzKHg9bG9uLCB5PWxhdCwgY29sb3I9U2Vyb3R5cGUpLHNpemU9MS41LCBhbHBoYT0wLjUpKwogIGdndGl0bGUoIkxvY2FsaWRhZGVzOiBEaXNpbWlsYXJpZGFkIDk5JSIpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygidHVycXVvaXNlMyIsImRlZXBwaW5rIiwibWVkaXVtYmx1ZSIsImdyZWVuMyIpKQoKCmBgYAoqKkZpZ3VyYSAxNC4qKiBMb2NhbGlkYWRlcyBkZSBzZWN1ZW5jaWFzIGRlbCBHZW4gRSA5OSUgZGlzaW1pbGFyZXMuCgoKIyMjIEHDsW9zOiBEaXNpbWlsYXJpZGFkIDk3JSAjIyMKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYsIGVjaG8gPSBGQUxTRX0KCnllYXJzRCA8LSB1bmlxdWUoRGlzXzk3JFllYXIpCgpjb3VudF95ZWFyc0QgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aCh5ZWFyc0QpKXsKICBjb3VudF95ZWFyc0RbaSwgIlllYXIiXSA8LSB5ZWFyc0RbaV0KICBjb3VudF95ZWFyc0RbaSwgIm51bWJlcl95ZWFyIl0gPC0gbGVuZ3RoKERpc185N1t3aGljaChEaXNfOTckWWVhcj09eWVhcnNEW2ldKSwxMF0pCiAgY291bnRfeWVhcnNEWzMsICJudW1iZXJfeWVhciJdIDwtIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTckWWVhcik9PVQpKQp9Cgpjb3VudF95ZWFyc0QgPC0gdHJhbnNmb3JtKGNvdW50X3llYXJzRCwgWWVhcj0gcmVvcmRlcihZZWFyLCAtbnVtYmVyX3llYXIpKQpnZ3Bsb3QoZGF0YSA9IGNvdW50X3llYXJzRCwgYWVzKHggPSBZZWFyLCB5ID0gbnVtYmVyX3llYXIsIGNvbG9yPVllYXIpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGw9IndoaXRlIikrCiAgbGFicyh4PSAiWWVhciIsIHk9ICJEYXRhIE51bWJlciIpKwogIHNjYWxlX2NvbG9yX2dyZXkoc3RhcnQ9IDAuMSwgZW5kPTAuNykrCiAgdGhlbWVfY2xhc3NpYygpKwogIGdndGl0bGUoIkHDsW9zOiBEaXNpbWlsYXJpZGFkIDk3JSIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIGNvb3JkX2ZsaXAoKQoKIyBBw7FvcyBxdWUgZnVlcm9uIGVsaW1pbmFkb3M6CiMgc2V0ZGlmZihjb3VudF95ZWFyc1MkWWVhciwgY291bnRfeWVhcnNEJFllYXIpCgojc29ydChjb3VudF95ZWFyc0QkWWVhclsxOjM3XSkKCmBgYAoqKkZpZ3VyYSAxNS4qKiBBw7FvcyByZWdpc3RyYWRvcyBwYXJhIGNhc29zIGNvbiBzZWN1ZW5jaWFzIDk3JSBkaXNpbWlsYXJlcy4KCjE5NDUgMTk2MCAxOTYyIDE5NjMgMTk2OCAxOTcwIDE5NzIgMTk3MyAxOTc0IDE5NzggMTk3OSAxOTgwIDE5ODIgMTk4MyAxOTg2IDE5ODggMTk5MSAxOTkzIDE5OTQgMTk5NSAxOTk2IDIwMDAgMjAwMSAyMDAyIDIwMDMgMjAwNCAyMDA1IDIwMDYgMjAwNyAyMDA4IDIwMDkgMjAxMCAyMDExIDIwMDEyIDIwMTMgMjAxNCAKIAoKIyMjIEHDsW9zOiBEaXNpbWlsYXJpZGFkIDk4JSAjIyMKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gOCwgZWNobyA9IEZBTFNFfQoKeWVhcnNTIDwtIHVuaXF1ZShEaXNfOTgkWWVhcikKCmNvdW50X3llYXJzUyA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKHllYXJzUykpewogIGNvdW50X3llYXJzU1tpLCAiWWVhciJdIDwtIHllYXJzU1tpXQogIGNvdW50X3llYXJzU1tpLCAibnVtYmVyX3llYXIiXSA8LSBsZW5ndGgoRGlzXzk4W3doaWNoKERpc185OCRZZWFyPT15ZWFyc1NbaV0pLDEwXSkKICBjb3VudF95ZWFyc1NbMywgIm51bWJlcl95ZWFyIl0gPC0gbGVuZ3RoKHdoaWNoKGlzLm5hKERpc185OCRZZWFyKT09VCkpCn0KCmNvdW50X3llYXJzUyA8LSB0cmFuc2Zvcm0oY291bnRfeWVhcnNTLCBZZWFyPSByZW9yZGVyKFllYXIsIC1udW1iZXJfeWVhcikpCmdncGxvdChkYXRhID0gY291bnRfeWVhcnNTLCBhZXMoeCA9IFllYXIsIHkgPSBudW1iZXJfeWVhciwgY29sb3I9WWVhcikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbD0id2hpdGUiKSsKICBsYWJzKHg9ICJZZWFyIiwgeT0gIkRhdGEgTnVtYmVyIikrCiAgc2NhbGVfY29sb3JfZ3JleShzdGFydD0gMC4xLCBlbmQ9MC43KSsKICB0aGVtZV9jbGFzc2ljKCkrCiAgZ2d0aXRsZSgiQcOxb3M6IERpc2ltaWxhcmlkYWQgOTglIikrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgY29vcmRfZmxpcCgpCgpgYGAKKipGaWd1cmEgMTYuKiogQcOxb3MgcmVnaXN0cmFkb3MgcGFyYSBjYXNvcyBjb24gc2VjdWVuY2lhcyA5OCUgZGlzaW1pbGFyZXMuCgoxOTQ1IDE5NjAgMTk2MSAxOTYyIDE5NjMgMTk2NSAxOTY2IDE5NjggMTk3MCAxOTcyIDE5NzMgMTk3NCAxOTc3IDE5NzggMTk3OSAxOTgwIDE5ODEgMTk4MiAxOTgzIDE5ODUgMTk4NiAxOTg3IDE5ODggMTk4OSAxOTkxIDE5OTMgMTk5NCAxOTk1IDE5OTYgMTk5NyAxOTk4IDE5OTkgMjAwMCAyMDAxIDIwMDIgMjAwMyAyMDA0IDIwMDUgMjAwNiAyMDA3IDIwMDggMjAwOSAyMDEwIDIwMTEgMjAxMiAyMDEzIDIwMTQKCiMjIyBBw7FvczogRGlzaW1pbGFyaWRhZCA5OSUgIyMjIApgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA5LCBlY2hvID0gRkFMU0V9Cgp5ZWFyc0QgPC0gdW5pcXVlKERpc185OSRZZWFyKQoKY291bnRfeWVhcnNEIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoeWVhcnNEKSl7CiAgY291bnRfeWVhcnNEW2ksICJZZWFyIl0gPC0geWVhcnNEW2ldCiAgY291bnRfeWVhcnNEW2ksICJudW1iZXJfeWVhciJdIDwtIGxlbmd0aChEaXNfOTlbd2hpY2goRGlzXzk5JFllYXI9PXllYXJzRFtpXSksMTBdKQogIGNvdW50X3llYXJzRFszLCAibnVtYmVyX3llYXIiXSA8LSBsZW5ndGgod2hpY2goaXMubmEoRGlzXzk5JFllYXIpPT1UKSkKfQoKY291bnRfeWVhcnNEIDwtIHRyYW5zZm9ybShjb3VudF95ZWFyc0QsIFllYXI9IHJlb3JkZXIoWWVhciwgLW51bWJlcl95ZWFyKSkKZ2dwbG90KGRhdGEgPSBjb3VudF95ZWFyc0QsIGFlcyh4ID0gWWVhciwgeSA9IG51bWJlcl95ZWFyLCBjb2xvcj1ZZWFyKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsPSJ3aGl0ZSIpKwogIGxhYnMoeD0gIlllYXIiLCB5PSAiRGF0YSBOdW1iZXIiKSsKICBzY2FsZV9jb2xvcl9ncmV5KHN0YXJ0PSAwLjEsIGVuZD0wLjcpKwogIHRoZW1lX2NsYXNzaWMoKSsKICBnZ3RpdGxlKCJBw7FvczogRGlzaW1pbGFyaWRhZCA5OSUiKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBjb29yZF9mbGlwKCkKCiMgQcOxb3MgcXVlIGZ1ZXJvbiBlbGltaW5hZG9zOgojIHNldGRpZmYoY291bnRfeWVhcnNTJFllYXIsIGNvdW50X3llYXJzRCRZZWFyKQoKYGBgCioqRmlndXJhIDE3LioqIEHDsW9zIHJlZ2lzdHJhZG9zIHBhcmEgY2Fzb3MgY29uIHNlY3VlbmNpYXMgOTklIGRpc2ltaWxhcmVzLgoKIyMjIEZyZWN1ZW5jaWEgZGUgbG9zIGHDsW9zIHJlcG9ydGFkb3MgcG9yIGNhZGEgcGFpczogRGlzaW1pbGFyaWRhZCA5NyUgIyMjCmBgYHtyLCBmaWcud2lkdGggPSAxOCwgZmlnLmhlaWdodCA9IDEwLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnllYXJzRCA8LSBuYS5vbWl0KHVuaXF1ZShEaXNfOTckWWVhcikpCgpDb3VudHJ5X25hbWVzRCA8LSBuYS5vbWl0KHVuaXF1ZShEaXNfOTckQ291bnRyeSkpCgpDb3VudHJ5X3llYXIgPC0gZGF0YS5mcmFtZSgpCkNvdW50cnlfeWVhcl9tYXMgPC0gZGF0YS5mcmFtZSgpCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXNEKSl7CiAgZm9yKGogaW4gMTpsZW5ndGgoeWVhcnNEKSl7CiAgICBjby5kYXRhIDwtIERpc185N1t3aGljaChEaXNfOTckQ291bnRyeT09Q291bnRyeV9uYW1lc0RbaV0gJiBEaXNfOTckWWVhcj09eWVhcnNEW2pdKSxjKDksMTEpXQogICAgQ291bnRyeSA8LSBhcy5jaGFyYWN0ZXIoY28uZGF0YSRDb3VudHJ5WzFdKQogICAgWWVyYW5vIDwtIGNvLmRhdGEkWWVhclsxXQogICAgTnVtYmVyX2Nhc2VzIDwtIGxlbmd0aChjby5kYXRhJFllYXIpCiAgICBzdWJkYXRhIDwtIGNiaW5kKENvdW50cnksIFllcmFubywgTnVtYmVyX2Nhc2VzKQogICAgQ291bnRyeV95ZWFyIDwtIHJiaW5kKENvdW50cnlfeWVhcixzdWJkYXRhKQogIH0KICBDb3VudHJ5X3llYXJfbWFzIDwtIHJiaW5kKENvdW50cnlfeWVhcikKfQoKQ291bnRyeV95ZWFyX21hcyA8LSBuYS5vbWl0KENvdW50cnlfeWVhcl9tYXMpCgpDb3VudHJ5X3llYXJfbWFzJE51bWJlcl9jYXNlcyA8LSBhcy5jaGFyYWN0ZXIoQ291bnRyeV95ZWFyX21hcyROdW1iZXJfY2FzZXMpCkNvdW50cnlfeWVhcl9tYXMkTnVtYmVyX2Nhc2VzIDwtIGFzLm51bWVyaWMoQ291bnRyeV95ZWFyX21hcyROdW1iZXJfY2FzZXMpCgpDb3VudHJ5X3llYXJfbWFzJFllcmFubyA8LSBhcy5jaGFyYWN0ZXIoQ291bnRyeV95ZWFyX21hcyRZZXJhbm8pCkNvdW50cnlfeWVhcl9tYXMkWWVyYW5vIDwtIGFzLm51bWVyaWMoQ291bnRyeV95ZWFyX21hcyRZZXJhbm8pCgpDb3VudHJ5X3llYXJfbWFzIDwtIHRyYW5zZm9ybShDb3VudHJ5X3llYXJfbWFzLCBZZXJhbm89IHJlb3JkZXIoWWVyYW5vLCArWWVyYW5vKSkKCmdncGxvdChDb3VudHJ5X3llYXJfbWFzLCBhZXMoeD1ZZXJhbm8sIHk9Q291bnRyeSkpICsgCiAgZ2VvbV9wb2ludChhZXMoc2l6ZT1OdW1iZXJfY2FzZXMpKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQpgYGAKKipGaWd1cmEgMTguKiogRnJlY3VlbmNpYSBkZSBsb3MgYcOxb3MgcmVwb3J0YWRvcyBwYXJhIGNhZGEgcGFpcyBwYXJhIHNlY3VlbmNpYXMgOTclIGRpc2ltaWxhcmlkYWQuCgojIyMgRnJlY3VlbmNpYSBkZSBsb3MgYcOxb3MgcmVwb3J0YWRvcyBwb3IgY2FkYSBwYWlzOiBEaXNpbWlsYXJpZGFkIDk4JSAjIyMKCmBgYHtyLCBmaWcud2lkdGggPSAxOCwgZmlnLmhlaWdodCA9IDEwLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnllYXJzUyA8LSBuYS5vbWl0KHVuaXF1ZShEaXNfOTgkWWVhcikpCgpDb3VudHJ5X25hbWVzUyA8LSBuYS5vbWl0KHVuaXF1ZShEaXNfOTgkQ291bnRyeSkpCgpDb3VudHJ5X3llYXIgPC0gZGF0YS5mcmFtZSgpCkNvdW50cnlfeWVhcl9tYXMgPC0gZGF0YS5mcmFtZSgpCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXNTKSl7CiAgZm9yKGogaW4gMTpsZW5ndGgoeWVhcnNTKSl7CiAgICBjby5kYXRhIDwtIERpc185OFt3aGljaChEaXNfOTgkQ291bnRyeT09Q291bnRyeV9uYW1lc1NbaV0gJiBEaXNfOTgkWWVhcj09eWVhcnNTW2pdKSxjKDksMTEpXQogICAgQ291bnRyeSA8LSBhcy5jaGFyYWN0ZXIoY28uZGF0YSRDb3VudHJ5WzFdKQogICAgWWVyYW5vIDwtIGNvLmRhdGEkWWVhclsxXQogICAgTnVtYmVyX2Nhc2VzIDwtIGxlbmd0aChjby5kYXRhJFllYXIpCiAgICBzdWJkYXRhIDwtIGNiaW5kKENvdW50cnksIFllcmFubywgTnVtYmVyX2Nhc2VzKQogICAgQ291bnRyeV95ZWFyIDwtIHJiaW5kKENvdW50cnlfeWVhcixzdWJkYXRhKQogIH0KICBDb3VudHJ5X3llYXJfbWFzIDwtIHJiaW5kKENvdW50cnlfeWVhcikKfQoKQ291bnRyeV95ZWFyX21hcyA8LSBuYS5vbWl0KENvdW50cnlfeWVhcl9tYXMpCgpDb3VudHJ5X3llYXJfbWFzJE51bWJlcl9jYXNlcyA8LSBhcy5jaGFyYWN0ZXIoQ291bnRyeV95ZWFyX21hcyROdW1iZXJfY2FzZXMpCkNvdW50cnlfeWVhcl9tYXMkTnVtYmVyX2Nhc2VzIDwtIGFzLm51bWVyaWMoQ291bnRyeV95ZWFyX21hcyROdW1iZXJfY2FzZXMpCgpDb3VudHJ5X3llYXJfbWFzJFllcmFubyA8LSBhcy5jaGFyYWN0ZXIoQ291bnRyeV95ZWFyX21hcyRZZXJhbm8pCkNvdW50cnlfeWVhcl9tYXMkWWVyYW5vIDwtIGFzLm51bWVyaWMoQ291bnRyeV95ZWFyX21hcyRZZXJhbm8pCgpDb3VudHJ5X3llYXJfbWFzIDwtIHRyYW5zZm9ybShDb3VudHJ5X3llYXJfbWFzLCBZZXJhbm89IHJlb3JkZXIoWWVyYW5vLCArWWVyYW5vKSkKCmdncGxvdChDb3VudHJ5X3llYXJfbWFzLCBhZXMoeD1ZZXJhbm8sIHk9Q291bnRyeSkpICsgCiAgZ2VvbV9wb2ludChhZXMoc2l6ZT1OdW1iZXJfY2FzZXMpKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQoKCmBgYAoqKkZpZ3VyYSAxOS4qKiBGcmVjdWVuY2lhIGRlIGxvcyBhw7FvcyByZXBvcnRhZG9zIHBhcmEgY2FkYSBwYWlzIHBhcmEgc2VjdWVuY2lhcyA5OCUgZGlzaW1pbGFyaWRhZC4KCiMjIyBGcmVjdWVuY2lhIGRlIGxvcyBhw7FvcyByZXBvcnRhZG9zIHBvciBjYWRhIHBhaXM6IERpc2ltaWxhcmlkYWQgOTklICMjIwoKYGBge3IsIGZpZy53aWR0aCA9IDE4LCBmaWcuaGVpZ2h0ID0gMTAsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KeWVhcnNEIDwtIG5hLm9taXQodW5pcXVlKERpc185OSRZZWFyKSkKCkNvdW50cnlfbmFtZXNEIDwtIG5hLm9taXQodW5pcXVlKERpc185OSRDb3VudHJ5KSkKCkNvdW50cnlfeWVhciA8LSBkYXRhLmZyYW1lKCkKQ291bnRyeV95ZWFyX21hcyA8LSBkYXRhLmZyYW1lKCkKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lc0QpKXsKICBmb3IoaiBpbiAxOmxlbmd0aCh5ZWFyc0QpKXsKICAgIGNvLmRhdGEgPC0gRGlzXzk5W3doaWNoKERpc185OSRDb3VudHJ5PT1Db3VudHJ5X25hbWVzRFtpXSAmIERpc185OSRZZWFyPT15ZWFyc0Rbal0pLGMoOSwxMSldCiAgICBDb3VudHJ5IDwtIGFzLmNoYXJhY3Rlcihjby5kYXRhJENvdW50cnlbMV0pCiAgICBZZXJhbm8gPC0gY28uZGF0YSRZZWFyWzFdCiAgICBOdW1iZXJfY2FzZXMgPC0gbGVuZ3RoKGNvLmRhdGEkWWVhcikKICAgIHN1YmRhdGEgPC0gY2JpbmQoQ291bnRyeSwgWWVyYW5vLCBOdW1iZXJfY2FzZXMpCiAgICBDb3VudHJ5X3llYXIgPC0gcmJpbmQoQ291bnRyeV95ZWFyLHN1YmRhdGEpCiAgfQogIENvdW50cnlfeWVhcl9tYXMgPC0gcmJpbmQoQ291bnRyeV95ZWFyKQp9CgpDb3VudHJ5X3llYXJfbWFzIDwtIG5hLm9taXQoQ291bnRyeV95ZWFyX21hcykKCkNvdW50cnlfeWVhcl9tYXMkTnVtYmVyX2Nhc2VzIDwtIGFzLmNoYXJhY3RlcihDb3VudHJ5X3llYXJfbWFzJE51bWJlcl9jYXNlcykKQ291bnRyeV95ZWFyX21hcyROdW1iZXJfY2FzZXMgPC0gYXMubnVtZXJpYyhDb3VudHJ5X3llYXJfbWFzJE51bWJlcl9jYXNlcykKCkNvdW50cnlfeWVhcl9tYXMkWWVyYW5vIDwtIGFzLmNoYXJhY3RlcihDb3VudHJ5X3llYXJfbWFzJFllcmFubykKQ291bnRyeV95ZWFyX21hcyRZZXJhbm8gPC0gYXMubnVtZXJpYyhDb3VudHJ5X3llYXJfbWFzJFllcmFubykKCkNvdW50cnlfeWVhcl9tYXMgPC0gdHJhbnNmb3JtKENvdW50cnlfeWVhcl9tYXMsIFllcmFubz0gcmVvcmRlcihZZXJhbm8sICtZZXJhbm8pKQoKZ2dwbG90KENvdW50cnlfeWVhcl9tYXMsIGFlcyh4PVllcmFubywgeT1Db3VudHJ5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhzaXplPU51bWJlcl9jYXNlcykpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCgpgYGAKKipGaWd1cmEgMjAuKiogRnJlY3VlbmNpYSBkZSBsb3MgYcOxb3MgcmVwb3J0YWRvcyBwYXJhIGNhZGEgcGFpcyBwYXJhIHNlY3VlbmNpYXMgOTklIGRpc2ltaWxhcmlkYWQuCgoKIyMjIFBhaXMsIGxvY2FsaWRhZCB5IGHDsW8gIyMjCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTZ9CgoKIyA5NwpEYXRhX051bWJlciA8LSBjKGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTckQ291bnRyeSk9PUYpKSwKICAgICAgICAgICAgICAgICBsZW5ndGgod2hpY2goaXMubmEoRGlzXzk3JExvY2F0aW9uKT09RikpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTckQ291bnRyeSk9PUYgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKERpc185NyRZZWFyKT09RikpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh3aGljaChpcy5uYShEaXNfOTckQ291bnRyeSk9PUYgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKERpc185NyRMb2NhdGlvbik9PUYgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKERpc185NyRZZWFyKT09RikpKQoKCkRhdGEgPC0gYygiQ291bnRyeSIsICJDb3VudHJ5X0xvY2F0aW9uIiwgIkNvdW50cnlfeWVhciIsICJDb3VudHJ5X2xvY2F0aW9uX3llYXIiKQoKZHRfOTcgPC0gZGF0YS5mcmFtZShEYXRhLCBEYXRhX051bWJlcikKCiMgOTgKRGF0YV9OdW1iZXIgPC0gYyhsZW5ndGgod2hpY2goaXMubmEoRGlzXzk4JENvdW50cnkpPT1GKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHdoaWNoKGlzLm5hKERpc185OCRMb2NhdGlvbik9PUYpKSwKICAgICAgICAgICAgICAgICBsZW5ndGgod2hpY2goaXMubmEoRGlzXzk4JENvdW50cnkpPT1GICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShEaXNfOTgkWWVhcik9PUYpKSwKICAgICAgICAgICAgICAgICBsZW5ndGgod2hpY2goaXMubmEoRGlzXzk4JENvdW50cnkpPT1GICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShEaXNfOTgkTG9jYXRpb24pPT1GICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShEaXNfOTgkWWVhcik9PUYpKSkKCkRhdGEgPC0gYygiQ291bnRyeSIsICJDb3VudHJ5X0xvY2F0aW9uIiwgIkNvdW50cnlfeWVhciIsICJDb3VudHJ5X2xvY2F0aW9uX3llYXIiKQoKZHRfOTggPC0gZGF0YS5mcmFtZShEYXRhLCBEYXRhX051bWJlcikKCiMgOTkKRGF0YV9OdW1iZXIgPC0gYyhsZW5ndGgod2hpY2goaXMubmEoRGlzXzk5JENvdW50cnkpPT1GKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHdoaWNoKGlzLm5hKERpc185OSRMb2NhdGlvbik9PUYpKSwKICAgICAgICAgICAgICAgICBsZW5ndGgod2hpY2goaXMubmEoRGlzXzk5JENvdW50cnkpPT1GICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShEaXNfOTkkWWVhcik9PUYpKSwKICAgICAgICAgICAgICAgICBsZW5ndGgod2hpY2goaXMubmEoRGlzXzk5JENvdW50cnkpPT1GICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShEaXNfOTkkTG9jYXRpb24pPT1GICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShEaXNfOTkkWWVhcik9PUYpKSkKCkRhdGEgPC0gYygiQ291bnRyeSIsICJDb3VudHJ5X0xvY2F0aW9uIiwgIkNvdW50cnlfeWVhciIsICJDb3VudHJ5X2xvY2F0aW9uX3llYXIiKQoKZHRfOTkgPC0gZGF0YS5mcmFtZShEYXRhLCBEYXRhX051bWJlcikKCkNvbG95ZSA8LSByYmluZChkdF85NywgZHRfOTgsIGR0Xzk5KQoKdHlwZSA8LSBjKCI5NyAlIERpc2ltaWxhcmlkYWQiLCAiOTcgJSBEaXNpbWlsYXJpZGFkIiwgIjk3ICUgRGlzaW1pbGFyaWRhZCIsICI5NyAlIERpc2ltaWxhcmlkYWQiLCAiOTggJSBEaXNpbWlsYXJpZGFkIiwgIjk4ICUgRGlzaW1pbGFyaWRhZCIsICI5OCAlIERpc2ltaWxhcmlkYWQiLCAiOTggJSBEaXNpbWlsYXJpZGFkIiwgIjk5ICUgRGlzaW1pbGFyaWRhZCIsICI5OSAlIERpc2ltaWxhcmlkYWQiLCAiOTkgJSBEaXNpbWlsYXJpZGFkIiwgIjk5ICUgRGlzaW1pbGFyaWRhZCIpCgpDb2xveWUgPC0gY2JpbmQoQ29sb3llLCB0eXBlKQoKbGlicmFyeSgiZ2dwbG90MiIpCgpnZ3Bsb3QoZGF0YSA9IENvbG95ZSwgYWVzKHg9RGF0YSAsIHkgPSBEYXRhX051bWJlciwgZmlsbD10eXBlKSkrCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKwogIGdndGl0bGUoIlBhaXMsIExvY2FsaWRhZCB5IEHDsW9zOiBEaXNpbWlsYXJpZGFkIDk3LCA5OCwgOTklIikrCiAgc2NhbGVfY29sb3VyX2JyZXdlcigpKwogIHRoZW1lX21pbmltYWwoKQoKI2dncGxvdChkYXRhID0gc2Vyb3R5cGUsIGFlcyh4PU5hbWVfc2Vyb3R5cGUgLCB5ID0gZGF0YSwgZmlsbD10eXBlKSkrCiAjIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICAjc2NhbGVfY29sb3VyX2JyZXdlcigpKwogICN0aGVtZV9taW5pbWFsKCkKCgpgYGAKKipGaWd1cmEgMjEuKiogRnJlY3VlbmNpYSBkZSBsb3MgZGF0b3MgY29uIGRpc2ltaWxhcmlkYWQgZGVsIDk3LCA5OCB5IDk5JSBxdWUgY29udGllbmVuOiAxLiBQYWlzLCAyLiBQYWlzIHkgTG9jYWxpZGFkLCAzLiBQYWlzLCBMb2NhbGlkYWQgeSBhw7FvLCA0LiBQYWlzIHkgYcOxby4=